home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / laptop-mode-tools / modules / hdparm < prev    next >
Text File  |  2009-10-06  |  8KB  |  254 lines

  1. #! /bin/sh
  2. #
  3. # Laptop mode tools module: adjust hard drive powermanagement settings
  4. #
  5. # This is a core module that takes its configuration from the main config
  6. # file.
  7. #
  8.  
  9.  
  10. #
  11. # Function for drive capability check. This prevents ugly errors in
  12. # the kernel output about unsupported commands.
  13. #
  14. # $1 = drive name
  15. # $2 = capability (SDPARM/HDPARM or IDLE_TIMEOUT/POWERMGMT/WRITECACHE)
  16. is_capable() {
  17.     local dev=${1#/dev/}
  18.     local MEDIA=
  19.     local BUS=
  20.  
  21.     # If we are running udev, this is the most portable way
  22.     # It assumes more or less recent udev (> 070)
  23.     if [ $HAVE_UDEVINFO -ne 0 ] ; then
  24.         $LM_VERBOSE && echo -n "Querying $1 media type using udevinfo: " >> $OUTPUT
  25.         eval "$(udevinfo -q env -n $1 2>> $OUTPUT | egrep '(ID_TYPE=|ID_BUS=)' 2>&1 | tee -a $OUTPUT)"
  26.         if [ -n "$ID_TYPE" -a -n "$ID_BUS" ] ; then
  27.             $LM_VERBOSE && echo "type '$ID_TYPE' on bus '$ID_BUS' detected" >> $OUTPUT
  28.             MEDIA=$ID_TYPE
  29.             BUS=$ID_BUS
  30.         else
  31.             $LM_VERBOSE && echo "failed - udev not active?" >> $OUTPUT
  32.         fi
  33.     fi
  34.  
  35.     if [ -z "$MEDIA" ] ; then
  36.         $LM_VERBOSE && echo -n "Querying $1 media type using device name: " >> $OUTPUT
  37.         case $dev in
  38.             hd*)    # IDE device
  39.                 if [ -r /proc/ide/$dev/media ]; then
  40.                     MEDIA="$(cat /proc/ide/$dev/media)"
  41.                     BUS=ata
  42.                     if [ "$MEDIA" = cdrom ] ; then
  43.                         MEDIA=cd
  44.                     fi
  45.                 fi
  46.             ;;
  47.             sd*)    # SCSI disk
  48.                 # No need to check, sd is always SCSI disk
  49.                 MEDIA=disk
  50.                 BUS=scsi
  51.             ;;
  52.             sr* | scd* )
  53.                 # No need to check, sr or scd is always SCSI CD-ROM
  54.                 MEDIA=cd
  55.                 BUS=scsi
  56.             ;;
  57.  
  58.         esac
  59.         if [ -n "$MEDIA" ] ; then
  60.             $LM_VERBOSE && echo "type '$MEDIA' on bus '$BUS' detected" >> $OUTPUT
  61.         else
  62.             $LM_VERBOSE && echo "failed - unknown name" >> $OUTPUT
  63.         fi
  64.     fi
  65.  
  66.     if [ -z "$MEDIA" ] ; then
  67.         if [ "$HDPARM_AVAILABLE" = "1" ]; then
  68.             $LM_VERBOSE && echo -n "Querying $1 type using hdparm: " >> $OUTPUT
  69.             if hdparm -I $1 2> $OUTPUT | grep -q CD-ROM >> $OUTPUT 2>&1 ; then
  70.                 MEDIA=cd
  71.             else
  72.                 MEDIA=disk
  73.             fi
  74.             BUS=ata # or acts like it anyway, because hdparm supports it.
  75.             $LM_VERBOSE && echo "type '$MEDIA' on bus '$BUS' detected" >> $OUTPUT
  76.         fi
  77.     fi
  78.  
  79.     # Sanity check
  80.     if [ -z "$MEDIA" -o -z "$BUS" ] ; then
  81.         $LM_VERBOSE && echo "Querying $1 type - unknown type or bus, disabling hdparm/sdparm" >> $OUTPUT
  82.         return 1
  83.     fi
  84.  
  85.     if [ "$BUS" = "scsi" -a "$ASSUME_SCSI_IS_SATA" -ne 0 ] ;then
  86.         # Treat scsi disks as SATA devices. Unfortunately they are hard
  87.         # to recognize -- if anybody has a drive and cares to find out
  88.         # how to recognize them, please enlighten me!
  89.         BUS=ata
  90.     fi
  91.  
  92.     # Now check what capabilities we support for the
  93.     # various media and bus types.
  94.     case "$MEDIA:$BUS:$2" in
  95.         # Although CD-ROM drives usually support
  96.         # idle timeout settings, they don't usually
  97.         # support very low values, and we don't want
  98.         # to mess with that. We simply ignore anything
  99.         # that is a CD player.
  100.         cd:*:* ) return 1;;
  101.  
  102.         # ATA drives support the "hdparm" command but
  103.         # not normally the "sdparm" command.
  104.         *:ata:HDPARM ) return 0 ;;
  105.         *:ata:SDPARM ) return 1 ;;
  106.         
  107.         # SCSI drives support the "sdparm" command, but
  108.         # not normally the "hdparm" command.
  109.         *:scsi:SDPARM ) return 0 ;;
  110.         *:scsi:HDPARM ) return 1 ;;
  111.  
  112.         # On ATA disks everything is supported.
  113.         disk:ata:* ) return 0 ;;
  114.  
  115.         # For sdparm we only know how to set the idle
  116.         # timeout, nothing else at the moment.
  117.         *:scsi:IDLE_TIMEOUT ) return 0 ;;
  118.  
  119.         # No other capabilities are supported.
  120.         * ) return 1 ;;
  121.     esac
  122. }
  123.  
  124.  
  125. # Preparation: determine the tools we have available.
  126. if [ -x "$(which hdparm 2> /dev/null)" ]; then
  127.   HDPARM_AVAILABLE=1
  128. fi
  129. if [ -x "$(which sdparm 2> /dev/null)" ]; then
  130.   SDPARM_AVAILABLE=1
  131. fi
  132. HAVE_UDEVINFO=0
  133. if [ -x "$(which udevinfo 2> /dev/null)" ] ; then
  134.     UDEVVERSION=$(udevinfo -V | awk '{ print $3; }')
  135.     if [ "$UDEVVERSION" -gt 70 ] ; then
  136.         HAVE_UDEVINFO=1
  137.     else
  138.         $LM_VERBOSE && echo "udevinfo present but version not > 070, not using udev" >> $OUTPUT
  139.     fi
  140. fi
  141.  
  142.  
  143. if [ x$CONTROL_HD_POWERMGMT = x1 ] ; then
  144.     if [ $ON_AC -eq 1 ] ; then
  145.         if [ "$ACTIVATE" -eq 1 ] ; then
  146.             HD_POWERMGMT=$LM_AC_HD_POWERMGMT
  147.         else
  148.             HD_POWERMGMT=$NOLM_AC_HD_POWERMGMT
  149.         fi
  150.     else
  151.         HD_POWERMGMT=$BATT_HD_POWERMGMT
  152.     fi
  153.  
  154.     $LM_VERBOSE && echo "Setting powermanagement on drives to $HD_POWERMGMT." >> $OUTPUT
  155.     for THISHD in $HD ; do
  156.         if is_capable $THISHD POWERMGMT ; then
  157.             if is_capable $THISHD HDPARM ; then
  158.                 if [ "$HDPARM_AVAILABLE" = "1" ]; then
  159.                     $LM_VERBOSE && echo "Executing: hdparm -B $HD_POWERMGMT $THISHD" >> $OUTPUT
  160.                     hdparm -B $HD_POWERMGMT $THISHD >> $OUTPUT 2>&1
  161.                 else
  162.                     echo "ERROR: hdparm not installed."                
  163.                 fi
  164.             else
  165.                 $LM_VERBOSE && echo "Skipping $THISHD: powermgmt only possible with hdparm but drive does not" >> $OUTPUT
  166.                 $LM_VERBOSE && echo "support hdparm." >> $OUTPUT
  167.             fi
  168.         else
  169.             $LM_VERBOSE && echo "Skipping $THISHD: powermanagement control not supported." >> $OUTPUT
  170.         fi
  171.     done
  172. fi
  173.  
  174. if [ x$CONTROL_HD_IDLE_TIMEOUT = x1 ] ; then
  175.     # Spindown timeouts may only be set when data-loss sensitive
  176.     # features are active.
  177.     if [ "$ACTIVATE_WITH_POSSIBLE_DATA_LOSS" -eq 1 ] ; then
  178.         if [ $ON_AC -eq 1 ] ; then
  179.             HD_IDLE_TIMEOUT=$LM_AC_HD_IDLE_TIMEOUT
  180.             HD_IDLE_TIMEOUT_SECONDS=$LM_AC_HD_IDLE_TIMEOUT_SECONDS
  181.         else
  182.             HD_IDLE_TIMEOUT=$LM_BATT_HD_IDLE_TIMEOUT
  183.             HD_IDLE_TIMEOUT_SECONDS=$LM_BATT_HD_IDLE_TIMEOUT_SECONDS
  184.         fi
  185.     else
  186.         HD_IDLE_TIMEOUT=$NOLM_HD_IDLE_TIMEOUT
  187.         HD_IDLE_TIMEOUT_SECONDS=$NOLM_HD_IDLE_TIMEOUT_SECONDS
  188.     fi
  189.     $LM_VERBOSE && echo "Setting spindown timeout on drives to $HD_IDLE_TIMEOUT_SECONDS seconds." >> $OUTPUT
  190.     $LM_VERBOSE && echo "(hdparm configuration value = $HD_IDLE_TIMEOUT.)" >> $OUTPUT
  191.     for THISHD in $HD ; do
  192.         if is_capable $THISHD IDLE_TIMEOUT ; then
  193.             if is_capable $THISHD HDPARM ; then
  194.                 if [ "$HDPARM_AVAILABLE" = "1" ]; then
  195.                     $LM_VERBOSE && echo "Executing: hdparm -S $HD_IDLE_TIMEOUT $THISHD" >> $OUTPUT
  196.                     hdparm -S $HD_IDLE_TIMEOUT $THISHD >> $OUTPUT 2>&1
  197.                 else
  198.                     echo "ERROR: hdparm not installed."
  199.                 fi
  200.             elif is_capable $THISHD SDPARM ; then
  201.                 if [ "$SDPARM_AVAILABLE" = "1" ]; then
  202.                     HD_IDLE_TIMEOUT_DECISECONDS=$(($HD_IDLE_TIMEOUT_SECONDS*10))
  203.                     $LM_VERBOSE && echo "Executing: sdparm -q -s SCT=$HD_IDLE_TIMEOUT_DECISECONDS $THISHD" >> $OUTPUT
  204.                     sdparm -q -s SCT=$HD_IDLE_TIMEOUT_DECISECONDS $THISHD >> $OUTPUT 2>&1
  205.                 else
  206.                     echo "ERROR: sdparm not installed."
  207.                 fi
  208.             else
  209.                 $LM_VERBOSE && echo "Skipping $THISHD: drive supports neither hdparm nor sdparm." >> $OUTPUT
  210.             fi
  211.         else
  212.             $LM_VERBOSE && echo "Skipping $THISHD: idle timeout control not supported." >> $OUTPUT
  213.         fi
  214.     done
  215. fi
  216.  
  217. if [ x$CONTROL_HD_WRITECACHE = x1 ] ; then
  218.     # The writecache may only be enabled when data-loss sensitive
  219.     # features are active.
  220.  
  221.     if [ "$ACTIVATE" -eq 1 ] ; then
  222.         if [ "$ACTIVATE_WITH_POSSIBLE_DATA_LOSS" -eq 0 ] ; then
  223.             HD_WRITECACHE=0
  224.         else
  225.             HD_WRITECACHE=$LM_HD_WRITECACHE
  226.         fi
  227.     else
  228.         if [ $ON_AC -eq 1 ] ; then
  229.             HD_WRITECACHE=$NOLM_AC_HD_WRITECACHE
  230.         else
  231.             HD_WRITECACHE=$NOLM_BATT_HD_WRITECACHE
  232.         fi
  233.     fi
  234.     $LM_VERBOSE && echo "Setting write cache on drives to $HD_WRITECACHE." >> $OUTPUT
  235.     for THISHD in $HD ; do
  236.         if is_capable $THISHD WRITECACHE ; then
  237.             if is_capable $THISHD HDPARM ; then
  238.                 if [ "$HDPARM_AVAILABLE" = "1" ]; then
  239.                     $LM_VERBOSE && echo "Executing: hdparm -W $HD_WRITECACHE $THISHD" >> $OUTPUT
  240.                     hdparm -W $HD_WRITECACHE $THISHD >> $OUTPUT 2>&1
  241.                 else
  242.                     echo "ERROR: hdparm not installed."
  243.                 fi
  244.             else
  245.                 $LM_VERBOSE && echo "Skipping $THISHD: writecache only possible with hdparm but drive does not" >> $OUTPUT
  246.                 $LM_VERBOSE && echo "support hdparm." >> $OUTPUT
  247.             fi
  248.         else
  249.             $LM_VERBOSE && echo "Skipping $THISHD: writecache control not supported." >> $OUTPUT
  250.         fi
  251.     done
  252. fi
  253.  
  254.